package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
)

//### 提取ip相关信息
//- 接口：https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=要查询的ip地址
//- 给一个ip地址，可以通过该接口获取到省份和运营商
//- 实现一个ip查询功能
//- 用户输入一个ip地址，将查询到的结果显示给用户
//- 并将结果用以下格式写入到文件：ip,国家,省份,运营商
//fmt.Println(string(body))
/*{"data":
{"area":"",
"country":"中国",
"isp_id":"100017",
"queryIp":"222.244.201.2",
"city":"长沙",
"ip":"222.244.201.2",
"isp":"电信",
"county":"",
"region_id":"430000",
"area_id":"",
"county_id":null,
"region":"湖南",
"country_id":"CN",
"city_id":"430100"},
"msg":"query success",
"code":0}*/
type Datas struct {
	Code int `json:"code"`
	Data result `json:data`
}
type result struct {
	Ip string `json:"ip"`
	Country string `json:"country"`
	Region string `json:"region"`
	Isp string `json:"isp"`
}
func main()  {
	//IP := "222.244.201.2"
	var IP string
	fmt.Println("请输入查询的IP：")
	fmt.Scan(&IP)
	url := "https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=" + IP
	//查询IP信息
	response, err := http.Get(url)
	if err != nil {
		fmt.Println("请求失败",err)
	}
	//延迟执行，获取响应体
	defer response.Body.Close()
	//读取响应报文体的数据
	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println("读取响应失败",err)
		return
	}
	d := Datas{}
	//进行数据解析，将解析后的数据直接写入到Datas结构体变量所在的内存地址中，保证在函数外部也可以访问到更新后的结果。
	err1 := json.Unmarshal(body,&d)
	if err1 != nil{
		fmt.Println("解析数据失败",err1)
		return
	}
	if d.Code == 0{
		fmt.Println("获取数据成功~~~~~~")
		fmt.Println("IP地址：",d.Data.Ip)
		fmt.Println("国家：",d.Data.Country)
		fmt.Println("省份：",d.Data.Region)
		fmt.Println("运营商：",d.Data.Isp)
	}else {
		fmt.Println("获取数据失败~~~~~~~")
		return
	}
	fileName := "ipInfo.txt"
	file, err2 := os.OpenFile(fileName,os.O_CREATE|os.O_RDONLY|os.O_APPEND,0644)
	if err2 != nil{
		fmt.Println("打开文件失败",err2)
		return
	}
	//延迟执行，关闭文件
	defer file.Close()
	writer := bufio.NewWriter(file)
	//延迟执行，刷新数据
	defer writer.Flush()
	_,err3 := writer.WriteString("IP地址："+d.Data.Ip+"\n" + "国家："+d.Data.Country+"\n" + "省份："+d.Data.Region+"\n" + "运营商："+d.Data.Isp+"\n")
	if err3 != nil{
		fmt.Println("写入文件失败",err3)
		return
	}

}





